package model

import (
	"fmt"
	"ginblog/utils/errormsg"

	"gorm.io/gorm"
)

type Article struct {
	Category Category `gorm:"foreignKey: Cid"` // 这里是Article的一个外键 （相当于子类继承了父类）
	gorm.Model
	Title        string `gorm:"type: varchar(100); not null" json:"title"`
	Cid          int    `gorm:"type: int; not null " json:"cid"`
	Desc         string `gorm:"type: varchar(100)" json:"desc"`
	Content      string `gorm:"type: longtext" json:"content"`
	Img          string `gorm:"type: varchar(100)" json:"img"`
	CommentCount int    `gorm:"type: int; not null; default:0" json:"comment_count"`
	ReadCount    int    `gorm:"type: int; not null; default:0" json:"read_count"`
}

//func (a Article) TableName() string {
//	return "article"
//}

// 新增文章
func CreateArt(data *Article) int {
	// gorm 新增是create
	err := db.Create(&data).Error
	if err != nil {
		return errormsg.ERROR // 500
	}
	return errormsg.SUCCESS
}

// 查询分类下的所有文章
func GetCateArt(cid, pageSize int, pageNum int) ([]Article, int, int64) {
	var cateArtList []Article
	// 返回总数
	var total int64
	// gorm的预加载
	err := db.Preload("Category").Limit(pageSize).Offset((pageNum-1)*pageSize).Where("cid = ?", cid).
		Find(&cateArtList).Error
	db.Model(&cateArtList).Where("cid = ?", cid).Count(&total)
	if err != nil {
		return nil, errormsg.ERROR_CATE_NOT_EXIST, 0
	}
	return cateArtList, errormsg.SUCCESS, total
}

// 查询单个文章信息
func GetArtInfo(id int) (Article, int) {
	var art Article
	err := db.Where("id = ?", id).Preload("Category").First(&art).Error
	db.Model(&art).Where("id = ?", id).UpdateColumn("read_count", gorm.Expr("read_count + ?", 1))
	if err != nil {
		return art, errormsg.ERROR_ART_NOT_EXIST
	}
	return art, errormsg.SUCCESS
}

// 查询文章列表
func GetArts(pageSize int, pageNum int) ([]Article, int, int64) {
	var articleList []Article
	// 返回总数
	var total int64
	var err error

	err = db.Select("article.id, title, img, created_at, updated_at, `desc`, comment_count, read_count, category.name").
		Limit(pageSize).Offset((pageNum - 1) * pageSize).
		Order("Created_At DESC").Joins("Category").Find(&articleList).Error
	db.Model(&articleList).Count(&total)
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil, errormsg.ERROR, 0
	}
	return articleList, errormsg.SUCCESS, total
	// 传入的pageSize为-1 则不需要 分页 同理 pageNum 传入为-1 也不需要分页
	// 这里是通过limit分页获取用户列表
}

// 搜索文章标题
func SearchArticle(title string, pageSize int, pageNum int) ([]Article, int, int64) {
	var articleList []Article
	// 返回总数
	var total int64
	var err error
	err = db.Select("article.id,title, img, created_at, updated_at, `desc`, comment_count, read_count, category.name").Limit(pageSize).Offset((pageNum-1)*pageSize).Order("Created_At DESC").Joins("Category").Where("title LIKE ?",
		title+"%",
	).Find(&articleList).Count(&total).Error
	// 单独计数
	//db.Model(&articleList).Count(&total)
	if err != nil {
		return nil, errormsg.ERROR, 0
	}
	return articleList, errormsg.SUCCESS, total
}

// 编辑文章
func EditArt(id int, data *Article) int {
	// 使用map传参来更新数据库中的数据 因为gorm使用结构体更新数据 不会更新0值
	var maps = make(map[string]interface{})
	var art Article
	maps["title"] = data.Title
	maps["cid"] = data.Cid
	maps["desc"] = data.Desc
	maps["content"] = data.Content
	maps["img"] = data.Img
	// 更新的语句
	err := db.Model(&art).Where("id = ?", id).Updates(&maps).Error
	fmt.Println(err)
	if err != nil {
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}

// 删除文章
func DeleteArt(id int) int {
	var art Article
	err := db.Where("id = ?", id).Delete(&art).Error
	if err != nil {
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}
